// 引入 @grpc/grpc-js 模块，它是 gRPC 的 JavaScript 实现
// 用于创建和管理 gRPC 客户端和服务器，能实现高效的远程过程调用
const grpc = require('@grpc/grpc-js');

// 引入自定义的 proto 模块，该模块通常是根据 .proto 文件生成的
// 包含了 gRPC 服务和消息的定义，使得代码可以使用这些服务和消息进行通信
const message_proto = require('./proto');

// 引入自定义的 const 模块，该模块一般定义了各种常量
// 例如错误码、状态码等，方便在代码中统一管理和使用这些常量
const const_module = require('./const');

// 从 uuid 库中引入 v4 函数，并将其重命名为 uuidv4
// uuidv4 函数用于生成通用唯一识别码（UUID），保证生成的 ID 在全球范围内的唯一性
// 常被用于需要唯一标识的场景，如生成验证码、用户 ID 等
const { v4: uuidv4 } = require('uuid');

// 引入自定义的 email 模块，该模块封装了与邮件发送相关的功能
// 例如创建邮件传输对象、配置邮件选项、发送邮件等操作
const emailModule = require('./email');

const redis_module=require('./redis');



async function GetVarifyCode(call, callback) {
    console.log("email is ", call.request.email)
    try{
        let query_res = await redis_module.GetRedis(const_module.code_prefix+call.request.email);
        console.log("query_res is ", query_res)
        let uniqueId=query_res;
        if(query_res==null){
            uniqueId = uuidv4();
            if(uniqueId.length>4){
                uniqueId=uniqueId.substring(0,4);
            }
            let bres =await redis_module.SetRedisExpire(const_module.code_prefix+call.request.email,uniqueId,600)
            if(!bres){
                callback(null, { email:  call.request.email,
                    error:const_module.Errors.RedisErr
                });
                return;
            }
        }

       
        console.log("uniqueId is ", uniqueId)
        let text_str =  '您的验证码为'+ uniqueId +'请三分钟内完成注册'
        //发送邮件
        let mailOptions = {
            from: '18296946568@163.com',
            to: call.request.email,
            subject: '验证码',
            text: text_str,
        };
         // 调用邮件模块的 SendMail 函数异步发送邮件，并等待发送结果
        let send_res = await emailModule.SendMail(mailOptions);
        console.log("send res is ", send_res)

        callback(null, { email:  call.request.email,
            error:const_module.Errors.Success
        }); 


    }catch(error){
        console.log("catch error is ", error)

        callback(null, { email:  call.request.email,
            error:const_module.Errors.Exception
        }); 
    }

}

function main() {
    // 创建一个新的 gRPC 服务器实例
    var server = new grpc.Server()
    // 向服务器中添加服务定义
    // 第一个参数是服务定义，从 message_proto 模块中获取
    // 第二个参数是一个对象，包含服务方法的实现，这里将 GetVarifyCode 函数作为处理函数
    server.addService(message_proto.VarifyService.service, { GetVarifyCode: GetVarifyCode })
    // 绑定服务器到指定的地址和端口，并设置为不安全连接（不使用 TLS）
    // 第一个参数是服务器监听的地址和端口，0.0.0.0 表示监听所有可用的网络接口，端口为 50051
    // 第二个参数是服务器的认证凭据，这里使用不安全连接
    // 第三个参数是回调函数，当服务器绑定成功后执行
    server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {
        //server.start()
        console.log('grpc server started')        
    })
}

main()